package com.task.scheduling.dao;
import java.util.List;
import java.util.Date;
import org.apache.ibatis.annotations.Param;
import com.task.scheduling.model.TaskSchedulingModel;
import org.springframework.stereotype.Repository;

@Repository
public interface TaskSchedulingDao {

	/**
	 * 按照id获取任务
	 * @param id
	 * @return
	 */
	TaskSchedulingModel getTaskById(@Param("id") long id);

	/**
	 * 添加任务
	 * @param taskSchedulingModel
	 */
	void addTask(TaskSchedulingModel taskSchedulingModel);


	/**
	 * 根据id更新任务
	 */
	int updateTaskSchedule(TaskSchedulingModel model);

	/**
	 * 更新心跳
	 * @param id
	 * @return
	 */
	int heartBeat(@Param("id") long id);

	/**
	 * 锁定任务
	 */
	int lockTaskSchedule(@Param("id") long id, @Param("executor") String executor);


	/**
	 * 更新执行失败的任务为新任务，重新执行
	 * 状态是4的任务
	 */
	int reviveTask(@Param("updateTime") Date updateTime);


	/**
	 * 更新监控判定死掉的任务为未执行
	 * 状态是1或者2的任务
	 */
	int reviveTaskById(@Param("id") long id, @Param("updateTime") Date updateTime);


	/**
	 * 获取新任务
	 */
	TaskSchedulingModel getNewTask(@Param("now") Date now, @Param("seconds") int seconds, @Param("ids") List<Long> ids);


	/**
	 * 获取可能挂掉的任务
	 */
	List<TaskSchedulingModel> getDeathTask(@Param("now") Date now);


	/**
	 * 根据状态获取任务
	 * @param taskStatus
	 * @return
	 */
	List<TaskSchedulingModel> getTaskByStatus(@Param("taskStatus") int taskStatus);

	/**
	 * 更新任务的执行状态为失败
	 * @param id
	 * @param updateTime
	 * @return
	 */
	int updateTaskToFail(@Param("id") long id, @Param("taskMessage") String taskMessage, @Param("updateTime") Date updateTime);

	/**
	 * 更新任务的执行时间
	 * @param id
	 * @param doTime
	 * @param updateTime
	 * @return
	 */
	int updateDoTime(@Param("id") long id, @Param("doTime") Date doTime, @Param("updateTime") Date updateTime);

	/**
	 * 更新任务的监控状态
	 */
	int updateMonitor(@Param("id") long id, @Param("initMonitor") int initMonitor, @Param("chMonitor") int chMonitor);

	/**
	 * 获取所有的执行者
	 * @return
	 */
	List<String> getAllExecutors();
}
